//
//  main.m
//  NSArray
//
//  Created by admin on 2019/8/8.
//  Copyright © 2019 猫爷爷的酱醋茶. All rights reserved.
//

/*
 
 C语言的数组
    1.可以存储多个数据，元素类型一致
    2.数组长度固定，一旦创建无法更改
    3.每个元素都是紧密相连的，也无法新增和删除
 
 
 OC的NSArray数组
    特点：
        1.是Foundation中的一个类，对C语言的数组有了很大的增强
        2.只能存储OC对象，任意的OC对象，不能存储非OC对象， 所以基本数据类型等非OC对象无法存储
        3.NSArray数组不可变，一旦初始化完毕，里面的元素永久固定，无法新增和删除
        4.NSArray元素的类型是id类型。
 
    创建：
        1）以下创建的数组没有意义
          a) NSArray *array1 = [NSArray new];
             NSArray *array2 = [[NSArray alloc]init];
             NSArray *array3 = [NSArray array];
            因为，默认数组元素个数为0，且数组长度无法更改，这么创建的NSArray数组没有任何意义。
 
          b) 创建一个元素的数组，也没有意义
             + (instancetype)arrayWithObject:(ObjectType)anObject;
 
             NSArray *arr = [NSArray arrayWithObject:@"IOS开发者"];
 
        2）正确的创建方式
 
            + (instancetype)arrayWithObjects:(ObjectType)firstObj, ...;
 
            NSArray *arr = [NSArray arrayWithObjects:@"jack",@"rose",nil,@"Maoyeye", nil];
            数组中，遇到nil，判定为数组结束。
 
        3）创建数组的简要方式
 
            NSArray *arr = @[@"jack",@"rose",@"Maoyeye"];
 
 
 
 取第一个元素.firstObject 和 arr[0]的区别
    如果数组中没有元素，arr[0]取值越界，会报错，而.firstObject取到nil 不报错。
 
 
 遍历数组： - 例：TraversingTheArray();
    1.使用增强for循环来遍历数组
        for(数据类型 变量名 in 数组名)           //里面的变量叫做，迭代变量
         {
           直接通过变量名就可以拿到数组中的每一个元素
         }
 
        注意：迭代变量的数据类型需要和数组元素的数据类型一致
             当数组中的元素类型不一致的时候，迭代变量的数据类型建议使用 id类型。 例:TraversingTheArray();
 
    2.使用block遍历数组
 
 
 NSArray 和 NSString 的两个方法
    1.将数组中的元素连接起来组成一个新的字符串
    - (NSString *)componentsJoinedByString:(NSString *)separator;
 
 
    2.将字符串以指定的分隔符分成一个数组，每一部分就是数组的一个元素
    - (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
 
 NSArray 存储 基本数据类型
    简写：NSArray *array = @[@10,@20,@30];
 
 
NSArray 数据的持久性 - 例：NSArrayAndString();
 
    a）保存数组到磁盘上
    //.plist文件，属性列表文件 - 这个文件可以保存数组，将数组中的元素保存在这个文件中
    - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
    [arrTwo writeToFile:@"/Users/Admin/Desktop/test.plist" atomically:NO]
 
    b）从磁盘上读取数据
    + (nullable NSArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path;
    [NSArray arrayWithContentsOfFile:@"/Users/Admin/Desktop/test.plist"];
 
 */

#import <Foundation/Foundation.h>
#import "Person.h"

//数组的使用
void UserTheArray(void);

//遍历数组
void TraversingTheArray(void);

//数组和字符串
void NSArrayAndString(void);



int main(int argc, const char * argv[])
{
    
    NSArrayAndString();
    
    
    return 0;
}


//数组和字符串
void NSArrayAndString(void)
{
    //将数组中的元素连接起来组成一个新的字符串
    NSArray *arrOne = @[@"jack",@"rose",@"Maoyeye",@"dudu"];
    NSString *strOne = [arrOne componentsJoinedByString:@""];
    NSLog(@"%@",strOne);
    
    //将字符串以指定的分隔符分成一个数组，每一部分就是数组的一个元素
    NSString *strTwo = @"猫爷爷的酱醋茶，IOS开发者，IOS初级工程师";
    NSArray *arrTwo = [strTwo componentsSeparatedByString:@"，"];
    
    for(NSString *str in arrTwo)
    {
        NSLog(@"%@",str);
    }
    
    //将数组保存到磁盘中
//    BOOL res = [arrTwo writeToFile:@"/Users/Admin/Desktop/test.plist" atomically:NO];
//    if (res == YES) {
//        NSLog(@"保存成功");
//    }else{
//        NSLog(@"保存失败");
//    }
    
    NSLog(@"-----------");
    
    NSArray *readArray = [NSArray arrayWithContentsOfFile:@"/Users/Admin/Desktop/test.plist"];
    for(NSString *str in readArray)
    {
        NSLog(@"%@",str);
    }
    
    
    
    
}



//遍历数组
void TraversingTheArray(void)
{
    
    //1.最简单的一种方式
    NSArray *arr = @[@"jack",@"rose",@"Maoyeye",@"dudu"];
    for (int i = 0; i < arr.count; i++)
    {
        //NSLog(@"%@",arr[i]);
        NSLog(@"%@",[arr objectAtIndex:i]);
    }
    
    NSLog(@"----------------");
    
    //2.使用增强版的for...in
    for(NSString  *str in arr)
    {
        NSLog(@"%@",str);
    }
    
     NSLog(@"----------------");
    
    Person *person1 = [Person new];
    Person *person2 = [Person new];
    Person *person3 = [Person new];
    Person *person4 = [Person new];
    
    NSArray *arrOne = @[person1,person2,person3,person4,@"jack",@"rose"];
    NSLog(@"arrOne = %@",arrOne);
    
    for(id anyway in arrOne)
    {
        NSLog(@"%@",anyway);
    }
    
    NSLog(@"----------------");
    
    //这个方法将数组的元素遍历出来，要求我们传递一段处理元素的代码过去。
    [arrOne enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"arrOne[%lu] = %@",idx,obj); // 元素的下标,元素
        
        //如果希望停止遍历，就给stop参数赋值为YES
        if(idx == 3)
        {
            *stop = YES;
        }
    }];
    
}


//数组的使用
void UserTheArray(void)
{
    
    //NSArray *arr = [NSArray arrayWithObjects:@"jack",@"rose",nil,@"Maoyeye", nil];
    NSArray *arr = @[@"jack",@"rose",@"Maoyeye",@"jack",@"rose",@"Maoyeye"];
    NSLog(@"%@",arr);
    NSLog(@"%@",arr[1]);
    NSLog(@"%@",[arr objectAtIndex:1]);
    NSLog(@"arr的个数%lu",arr.count);
    
    //是否包含某个元素
    BOOL res = [arr containsObject:@"Maoyeye"];
    if (res == YES)
    {
        NSLog(@"存在");
    }else{
        NSLog(@"不存在");
    }
    
    //查找指定元素在数组中第一次出现的下标，如果没有找到，返回NSUInteger的最大值，也为NSNotFound
    NSUInteger index = [arr indexOfObject:@"jack"];
    if (index == NSNotFound)
    {
        NSLog(@"没有找到");
    }else{
        NSLog(@"找到的第一次出现的下标为：%lu",index);
    }
    
}
